package com.quanshu.exchange.support.api;

import com.quanshu.exchange.support.entity.GroupEntity;
import com.quanshu.exchange.support.entity.GroupLabelEntity;
import com.quanshu.exchange.support.entity.GroupMemberEntity;
import com.quanshu.exchange.support.entity.ImageFileEntity;
import com.quanshu.exchange.support.entity.LabelEntity;
import com.quanshu.exchange.support.entity.NotifyMsgEntity;
import com.quanshu.exchange.support.entity.RPInfoBean;
import com.quanshu.exchange.support.entity.RPStatusEntity;
import com.quanshu.exchange.support.entity.ReceiveRedEntity;
import com.quanshu.exchange.support.entity.RobResultEntity;
import com.quanshu.exchange.support.entity.UserEntity;
import com.quanshu.exchange.support.entity.tmp.TmpLabelBean;
import com.quanshu.exchange.support.entity.tmp.TmpStringData;
import com.quanshu.exchange.support.net.BaseResponse;

import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;

/**
 * 用户模块的接口
 */
public interface UserInterface {

    /**
     * 搜索好友
     *
     * @param memberid
     * @param friendid
     * @return
     */
    @FormUrlEncoded
    @POST("api/search_friend")
    Observable<BaseResponse<UserEntity>> searchFriend(@Field("key") String key,
                                                      @Field("memberid") String memberid,
                                                      @Field("friendid") String friendid);

    /**
     * 添加好友
     *
     * @param memberid
     * @param friendid
     * @return
     */
    @FormUrlEncoded
    @POST("api/add_friend")
    Observable<BaseResponse<UserEntity>> addFriend(@Field("key") String key,
                                                   @Field("memberid") String memberid,
                                                   @Field("friendid") String friendid);

    /**
     * 获取用户信息
     *
     * @param key
     * @param memberid
     * @return
     */
    @FormUrlEncoded
    @POST("api/get_member_info")
    Observable<BaseResponse<UserEntity>> getUser(@Field("key") String key,
                                                 @Field("memberid") String memberid);

    /**
     * 我的好友列表
     *
     * @param key
     * @param memberid
     * @return
     */
    @FormUrlEncoded
    @POST("api/friend_list")
    Observable<BaseResponse<List<UserEntity>>> getFriendList(@Field("key") String key,
                                                             @Field("memberid") String memberid);

    /**
     * 创建群
     *
     * @param key
     * @param memberid
     * @param group_name
     * @param group_introduce
     * @param group_photo
     * @param group_label_id
     * @param is_verify
     * @return
     */
    @FormUrlEncoded
    @POST("api/creat_group")
    Observable<BaseResponse<GroupEntity>> createGroup(@Field("key") String key,
                                                      @Field("memberid") String memberid,
                                                      @Field("group_name") String group_name,
                                                      @Field("group_introduce") String group_introduce,
                                                      @Field("group_photo") String group_photo,
                                                      @Field("group_label_id") int group_label_id,
                                                      @Field("is_verify") int is_verify);

    /**
     * 上传群头像
     */
    @Multipart
    @POST("api/upload_img")
    Observable<BaseResponse<ImageFileEntity>> uploadGroupImg(@Part MultipartBody.Part avatar);

    /**
     * 群标签列表
     *
     * @return
     */
    @GET("api/get_group_label")
    Observable<BaseResponse<List<GroupLabelEntity>>> getGroupLabelList();

    /**
     * 我的群组
     *
     * @param key
     * @param memberid
     * @return
     */
    @FormUrlEncoded
    @POST("api/my_groups")
    Observable<BaseResponse<List<GroupEntity>>> getMyGroups(@Field("key") String key,
                                                            @Field("memberid") String memberid);

    /**
     * 推荐群列表
     *
     * @param key
     * @param memberid
     * @return
     */
    @FormUrlEncoded
    @POST("api/recommend_group")
    Observable<BaseResponse<List<GroupEntity>>> getRecommendGroups(@Field("key") String key,
                                                                   @Field("memberid") String memberid);

    /**
     * 搜索群
     *
     * @param key
     * @param memberid
     * @param keyWords
     * @return
     */
    @FormUrlEncoded
    @POST("api/search_group")
    Observable<BaseResponse<List<GroupEntity>>> getSearchGroups(@Field("key") String key,
                                                                @Field("memberid") String memberid,
                                                                @Field("group_name") String keyWords);

    /**
     * 用户加群
     *
     * @param key
     * @param memberid
     * @param easeMobGroupId
     * @return
     */
    @FormUrlEncoded
    @POST("api/add_group_member")
    Observable<BaseResponse> joinGroup(@Field("key") String key,
                                       @Field("memberid") String memberid,
                                       @Field("hx_groupid") String easeMobGroupId);

    /**
     * 上传用户头像
     */
    @Multipart
    @POST("/index.php?model=api&controller=api_user&action=icon_img_upload")
    Observable<BaseResponse<String>> uploadUserAvatar(@Part("apikey") RequestBody apiKey,
                                                      @Part MultipartBody.Part avatar,
                                                      @Part("memberid") RequestBody memberid);

    /**
     * 获取群成员
     */
    @FormUrlEncoded
    @POST("api/get_group_users")
    Observable<BaseResponse<List<GroupMemberEntity>>> getGroupMembers(@Field("key") String key,
                                                                      @Field("group_id") int group_id);

    /**
     * 删除群成员
     */
    @FormUrlEncoded
    @POST("api/delete_group_member")
    Observable<BaseResponse> deleteGroupMember(@Field("key") String key,
                                               @Field("memberid") String memberid,
                                               @Field("group_id") int group_id,
                                               @Field("hx_groupid") String hx_groupid);

    /**
     * 获取群信息
     */
    @FormUrlEncoded
    @POST("api/get_group_info")
    Observable<BaseResponse<GroupEntity>> getGroupInfo(@Field("key") String key,
                                                       @Field("memberid") String memberid,
                                                       @Field("group_id") String group_id);

    /**
     * 更新群信息
     */
    @FormUrlEncoded
    @POST("api/update_group")
    Observable<BaseResponse<GroupEntity>> updateGroup(@Field("key") String key,
                                                      @Field("hx_groupid") String hx_groupid,
                                                      @Field("group_name") String group_name,
                                                      @Field("group_introduce") String group_introduce,
                                                      @Field("group_photo") String group_photo,
                                                      @Field("group_label_id") String group_label_id,
                                                      @Field("visible") int isOpen);

    /**
     * 群主转让
     */
    @FormUrlEncoded
    @POST("api/change_group_owner")
    Observable<BaseResponse> handoverGroupOwner(@Field("key") String key,
                                                @Field("memberid") String memberid,
                                                @Field("newowner") String newowner,
                                                @Field("hx_groupid") String hx_groupid);

    /**
     * 获取好友标签列表
     */
    @FormUrlEncoded
    @POST("api/get_friend_label")
    Observable<BaseResponse<List<LabelEntity>>> getFriendLabelList(@Field("key") String key,
                                                                   @Field("memberid") String memberid);

    /**
     * 创建标签
     */
    @FormUrlEncoded
    @POST("api/add_friend_label")
    Observable<BaseResponse<TmpLabelBean>> addFriendLabel(@Field("key") String key,
                                                          @Field("memberid") String memberid,
                                                          @Field("label_name") String label_name);

    /**
     * 修改标签
     */
    @FormUrlEncoded
    @POST("api/update_friend_label")
    Observable<BaseResponse> updateFriendLabelName(@Field("key") String key,
                                                   @Field("label_id") String label_id,
                                                   @Field("label_name") String label_name);

    /**
     * 添加标签成员
     */
    @FormUrlEncoded
    @POST("api/enter_friend_label")
    Observable<BaseResponse> addMember2FriendLabel(@Field("key") String key,
                                                   @Field("memberid") String memberid,
                                                   @Field("label_id") String label_id,
                                                   @Field("friends") String friends);

    /**
     * 删除标签成员
     */
    @FormUrlEncoded
    @POST("api/remove_friend_label")
    Observable<BaseResponse> removeLabelMember(@Field("key") String key,
                                               @Field("memberid") String memberid,
                                               @Field("friendid") String friendid);

    /**
     * 删除标签
     */
    @FormUrlEncoded
    @POST("api/del_friend_label")
    Observable<BaseResponse> removeLabel(@Field("key") String key,
                                         @Field("label_id") String label_id);


    /**
     * 修改好友备注
     */
    @FormUrlEncoded
    @POST("api/update_friend_remark")
    Observable<BaseResponse> setFriendRemark(@Field("key") String key,
                                             @Field("memberid") String memberid,
                                             @Field("friendid") String friendid,
                                             @Field("remark") String remark);

    /**
     * 删除好友
     */
    @FormUrlEncoded
    @POST("api/del_friend")
    Observable<BaseResponse> deleteFriend(@Field("key") String key,
                                          @Field("memberid") String memberid,
                                          @Field("friendid") String friendid);

    /**
     * 批量添加群成员
     */
    @FormUrlEncoded
    @POST("api/add_group_members")
    Observable<BaseResponse> addGroupMembers(@Field("key") String key,
                                             @Field("hx_groupid") String hx_groupid,
                                             @Field("memberids") String memberids);

    /**
     * 申请添加好友或者群
     */
    @FormUrlEncoded
    @POST("api/apply_friend")
    Observable<BaseResponse<String>> applyAddFriendOrGroup(@Field("key") String key,
                                                           @Field("memberid") String memberid,
                                                           @Field("apply_member") String apply_member,
                                                           @Field("apply_type") String apply_type,
                                                           @FieldMap Map<String, String> map);

    /**
     * 未读通知
     */
    @FormUrlEncoded
    @POST("api/untreated_count")
    Observable<BaseResponse<Integer>> getUnReadNotifiesNum(@Field("key") String key,
                                                           @Field("memberid") String memberid);

    /**
     * 获取通知消息
     */
    @FormUrlEncoded
    @POST("api/apply_for_me")
    Observable<BaseResponse<List<NotifyMsgEntity>>> getNotifies(@Field("key") String key,
                                                                @Field("memberid") String memberid);

    /**
     * 拒绝用户申请
     */
    @FormUrlEncoded
    @POST("api/reject_apply")
    Observable<BaseResponse> rejectApply(@Field("key") String key,
                                         @Field("memberid") String memberid,
                                         @Field("apply_member") String apply_member,
                                         @Field("apply_type") String apply_type);

    /**
     * 获取群人数
     */
    @FormUrlEncoded
    @POST("api/get_group_count")
    Observable<BaseResponse<TmpStringData>> getGroupMembersCount(@Field("key") String key,
                                                                 @Field("hx_groupid") String hx_groupid);

    /**
     * 创建红包
     */
    @FormUrlEncoded
    @POST("api/add_red_envelope")
    Observable<BaseResponse<TmpStringData>> createRedPackage(@Field("key") String key,
                                                             @Field("memberid") String memberid,
                                                             @Field("send_type") String chat_type,
                                                             @Field("red_type") String red_type,
                                                             @Field("money") String money,
                                                             @Field("number") String number,
                                                             @Field("to_whom") String to_whom,
                                                             @Field("pay_passwd") String pay_passwd,
                                                             @Field("content") String content);

    /**
     * 获取红包状态
     */
    @FormUrlEncoded
    @POST("api/return_red_status")
    Observable<BaseResponse<RPStatusEntity>> getRedPackageStatus(@Field("key") String key,
                                                                 @Field("red_id") String red_id,
                                                                 @Field("send_memberid") String send_memberid,
                                                                 @Field("charge_memberid") String charge_memberid);

    /**
     * 抢红包
     */
    @FormUrlEncoded
    @POST("api/red_results")
    Observable<BaseResponse<RobResultEntity>> robRedPackage(@Field("key") String key,
                                                            @Field("red_id") String red_id,
                                                            @Field("send_memberid") String send_memberid,
                                                            @Field("charge_memberid") String charge_memberid,
                                                            @Field("status") int status);

    /**
     * 领取红包记录
     *
     * @param memberid 用户账号
     * @param type     ​1是领取记录 2是发送记录 默认是1
     * @param key      key
     * @return
     */
    @FormUrlEncoded
    @POST("api/my_red_record")
    Observable<BaseResponse<List<ReceiveRedEntity>>> receiveRed(@Field("key") String key,
                                                                @Field("memberid") String memberid,
                                                                @Field("type") String type
    );

    /**
     * 发放红包记录
     *
     * @param memberid 用户账号
     * @param type     ​1是领取记录 2是发送记录 默认是1
     * @param key      key
     * @return
     */
    @FormUrlEncoded
    @POST("api/my_red_record")
    Observable<BaseResponse<List<RPInfoBean>>> sendOutRed(@Field("key") String key,
                                                          @Field("memberid") String memberid,
                                                          @Field("type") String type);

    /**
     * 牛兑换二维码支付
     *
     * @param key
     * @param memberid
     * @param business
     * @param money
     * @param pay_pwd
     * @return
     */
    @FormUrlEncoded
    @POST("api/niupoint_deduct")
    Observable<BaseResponse> payTokenByQrCode(@Field("key") String key,
                                              @Field("memberid") String memberid,
                                              @Field("business") String business,
                                              @Field("money") String money,
                                              @Field("pay_pwd") String pay_pwd);

}


